<?php
/**
 * sys component
 * @package kernel_lib_sys
 */
/**
 * sys component
 * 
 * @author pandajingjing
 * @package kernel_lib_sys
 */
abstract class sys_component{

	/**
	 * 私有属性
	 * 
	 * @var array $_arrPrivate
	 */
	protected $_arrPrivate=array();
	
	/**
	 * 内联脚本
	 * @var array
	 */
	static $_arrInlineScript=array();
	
	/**
	 * 内联样式
	 * @var array
	 */
	static $_arrInlineStyle=array();

	/**
	 * 构造函数
	 */
	function __construct(){
		$this->_arrPrivate['DEBUGGER']=sys_debugger::getInstance();
		$this->_arrPrivate['PAGEDATA']=array();
	}

	/**
	 * 获取UI
	 */
	abstract function getView();

	/**
	 * 入口方法（调度使用）
	 */
	function doView(){
		$this->loadComponentUI(dirname(pagename_to_path(get_class($this))).'/'.$this->getView());
	}

	/**
	 * 设定参数（调度使用）
	 * 
	 * @param array $p_arrParam       	
	 */
	function setDatas($p_arrParam){
		$this->_arrPrivate['PAGEDATA']=$p_arrParam;
	}

	/**
	 * 获取所有参数
	 * 
	 * @return array
	 */
	protected function getDatas(){
		return $this->_arrPrivate['PAGEDATA'];
	}

	/**
	 * 获取参数
	 * 
	 * @param string $p_strKey       	
	 * @return mix
	 */
	protected function getData($p_strKey){
		return isset($this->_arrPrivate['PAGEDATA'][$p_strKey])?$this->_arrPrivate['PAGEDATA'][$p_strKey]:NULL;
	}

	/**
	 * 设置页面参数,供phtml使用
	 * 
	 * @param string $p_strKey       	
	 * @param mix $p_mixValue       	     	
	 */
	protected function setData($p_strKey,$p_mixValue){
		$this->_arrPrivate['PAGEDATA'][$p_strKey]=$p_mixValue;
	}

	/**
	 * 使用的样式
	 * 
	 * @return array
	 */
	static function useSStyle(){
		return array();
	}
	
	/**
	 * 使用的样式
	 *
	 * @return array
	 */
	static function useOStyle(){
		return array();
	}

	/**
	 * 使用的样式
	 * 
	 * @return array
	 */
	static function useCBStyle(){
		return array();
	}

	/**
	 * 使用的JS
	 * 
	 * @return array
	 */
	static function useSScript(){
		return array();
	}

	/**
	 * 使用的JS
	 * 
	 * @return array
	 */
	static function useCBScript(){
		return array();
	}

	/**
	 * 使用的JS
	 *
	 * @return array
	 */
	static function useOScript(){
		return array();
	}
	
	/**
	 * 开始内联脚本
	 */
	protected function startLScript(){
		ob_start();
	}
	
	/**
	 * 结束内联脚本
	 */
	protected function endLScript(){
		self::$_arrInlineScript[]=ob_get_contents();
		ob_end_clean();
	}
	
	/**
	 * 获取内联脚本
	 * @return array
	 */
	protected function getLScript(){
		return self::$_arrInlineScript;
	}
	
	/**
	 * 开始内联样式
	 */
	protected function startLStyle(){
		ob_start();
	}
	
	/**
	 * 结束内联样式
	 */
	protected function endLStyle(){
		self::$_arrInlineStyle[]=ob_get_contents();
		ob_end_clean();
	}
	
	/**
	 * 获取内联样式
	 * @return array
	 */
	protected function getLStyle(){
		return self::$_arrInlineStyle;
	}
	
	/**
	 * 加载组件
	 * 
	 * @param string $p_strPath       	
	 * @param array $p_arrParam       	
	 */
	function doComponent($p_strPath,$p_arrParam=array()){
		if(isset($p_strPath[0])){
			if('/sys/debug'!=$p_strPath){
				$this->startDebug('Handle Component: '.$p_strPath);
				$this->showDebugMsg('Component Path: '.$p_strPath);
			}
			$this->loadComponentClass($p_strPath);
			$strClassName=path_to_componentname($p_strPath);
			$objRelClass=new ReflectionClass($strClassName);
			$objRelInstance=$objRelClass->newInstance();
			$objRelMethod=$objRelClass->getMethod('setDatas');
			$objRelMethod->invoke($objRelInstance,$p_arrParam);
			$objRelMethod=$objRelClass->getMethod('doView');
			$objRelMethod->invoke($objRelInstance);
			if('/sys/debug'!=$p_strPath){
				$this->stopDebug('Handle Component: '.$p_strPath);
			}
		}
	}

	/**
	 * 开始调试
	 * 
	 * @param string $p_strModule       	
	 */
	protected function startDebug($p_strModule){
		$this->_arrPrivate['DEBUGGER']->startDebug($p_strModule);
	}

	/**
	 * 发送调试信息
	 * 
	 * @param strint $p_strMsg
	 */
	protected function showDebugMsg($p_strMsg){
		$this->_arrPrivate['DEBUGGER']->showMsg($p_strMsg);
	}

	/**
	 * 结束调试
	 * 
	 * @param string $p_strModule       	
	 */
	protected function stopDebug($p_strModule){
		$this->_arrPrivate['DEBUGGER']->stopDebug($p_strModule);
	}

	/**
	 * 加载组件程序
	 * 
	 * @param string $p_strPath       	
	 */
	protected function loadComponentClass($p_strPath){
		$this->loadClass($p_strPath,'component');
	}

	/**
	 * 加载组件UI
	 * 
	 * @param string $p_strPath       	
	 */
	protected function loadComponentUI($p_strPath){
		$this->loadUI($p_strPath,'component');
	}

	/**
	 * 加载类
	 * 
	 * @param string $p_strPath       	
	 * @param string $p_strPrefix       	
	 */
	protected function loadClass($p_strPath,$p_strPrefix){
		$this->_loadFile(DIRECTORY_SEPARATOR.$p_strPrefix.str_replace('/',DIRECTORY_SEPARATOR,$p_strPath).'.php',false);
	}

	/**
	 * 加载UI
	 * 
	 * @param string $p_strPath       	
	 * @param string $p_strPrefix       	
	 */
	protected function loadUI($p_strPath,$p_strPrefix){
		$this->_loadFile(DIRECTORY_SEPARATOR.$p_strPrefix.str_replace('/',DIRECTORY_SEPARATOR,$p_strPath).'.phtml');
	}

	/**
	 * 加载UI
	 * 
	 * @param string $p_strPath       	
	 */
	protected function loadResource($p_strPath){
		$this->_loadFile($p_strPath,true);
	}

	/**
	 * 加载文件
	 * 
	 * @param string $p_strPath       	
	 */
	private function _loadFile($p_strPath,$p_bolIsUI=true){
		global $G_LOAD_PATH;
		load_lib('/sys/util/string');
		foreach($G_LOAD_PATH as $strPath){
			$strClassFilePath=$strPath.$p_strPath;
			if(file_exists($strClassFilePath)){
				$arrData=$this->_arrPrivate['PAGEDATA'];
				$arrHtml=sys_util_string::chgHtmlSpecialChars($arrData);
				if($p_bolIsUI){
					if(get_config('pageminify')){
						ob_start();
						include $strClassFilePath;
						$strContent=ob_get_contents();
						ob_end_clean();
						load_lib('/sys/util/minifyhtml');
						echo sys_util_minifyhtml::minify($strContent);
					}else{
						include $strClassFilePath;
					}
				}else{
					include_once $strClassFilePath;
				}
				return;
			}
		}
	}
}